package cn.demoncat.util.io;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

import org.slf4j.Logger;

import cn.demoncat.util.exception.ConnRuntimeException;
import cn.demoncat.util.lang.LogUtil;
import cn.demoncat.util.lang.constant.CharsetConstant;

/**
 * Socket工具
 * 
 * @author 延晓磊
 *
 * @since 2019年1月21日
 */
public class SocketUtil {

	private static final Logger LOG = LogUtil.get(SocketUtil.class);
	
	/**
	 * 客户端发起请求(短连接,UTF-8)
	 * 
	 * @param ip	服务端IP
	 * @param port	服务端端口
	 * @param param	请求报文
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年1月21日
	 */
	public static String request(String ip, Integer port, String param) {
		return request(ip, port, param, CharsetConstant.UTF8);
	}
	
	/**
	 * 客户端发起请求(短连接)
	 * 
	 * @param ip	服务端IP
	 * @param port	服务端端口
	 * @param param	请求报文
	 * @param charset	字符集，如GBK/UTF-8
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年1月21日
	 */
	public static String request(String ip, Integer port, String param, String charset) {
		LOG.info("连接服务端：ip = {}, port = {}, charset = {}, param = {}", ip, port, charset, param);
		Socket s = null;
		OutputStream out;
		InputStream in;
		try {
			// 创建Socket服务，连接指定的服务端 
			s = new Socket(ip,port);
			// 获取网络输出流
			out = s.getOutputStream();
			// 发送数据
			IoUtil.write(param, out, charset);
			// 发送完成
			s.shutdownOutput();
			// 通过Socket获取网络输入流
			in = s.getInputStream();
			// 读取响应
			return IoUtil.readToStr(in, charset);
		} catch (Exception e) {
			LOG.error("连接服务端失败：ip = {}, port = {}, charset = {}, param = {}", ip, port, charset, param, e);
			throw ConnRuntimeException.COMMON;
		} finally {
			// 关闭连接
			CloseUtil.close(s);
		}
	}
}
